/**
 * unserscore数组拍平
 */
/**
 * 数组扁平化
 * @param  {Array} input   要处理的数组
 * @param  {boolean} shallow 是否只扁平一层
 * @param  {boolean} strict  是否严格处理元素，下面有解释
 * @param  {Array} output  这是为了方便递归而传递的参数
 * 源码地址：https://github.com/jashkenas/underscore/blob/master/underscore.js#L528
 * https://github.com/mqyqingfeng/Blog/issues/36
 */
//underscore抽象扁平函数
// shallow true + strict false ：正常扁平一层
// shallow false + strict false ：正常扁平所有层
// shallow true + strict true ：去掉非数组元素
// shallow false + strict true ： 返回一个[]

function flatten(input, shallow, strict, output = []) {
    var idx = output.length;
    for (let i = 0; i < input.length; i++) {
        let value = input[i];
        if (Array.isArray(value)) {
            if (shallow) {
                let j = 0;
                while (j < value.length) {
                    output[idx++] = value[j++];
                }
            } else {
                flatten(value, shallow, strict, output);
                idx = output.length;
            }
        } else if (!strict) {
           output[idx++] = value;
        }
    }
    return output;
}

function _flatten(array,shallow){
  return flatten(array,shallow,false);
}
function unique(array){
   return Array.from(new Set(array));
}
function _union(){
  return unique(flatten(arguments,true,true));
}
